package ioc

import (
	"fmt"
	"sort"
)

// Map类型的IocContainer
type MapContainer struct {
	name   string
	storge map[string]Object
}

// 注册对象
func (c *MapContainer) Registry(name string, obj Object) {
	c.storge[name] = obj
}

// 获取对象
func (c *MapContainer) Get(name string) any {
	return c.storge[name]
}

// 调用所有被托管对象的Init方法, 对对象进行初始化
func (c *MapContainer) Init() error {
	keys := make([]string, 0, len(c.storge))
	for k := range c.storge {
		keys = append(keys, k)
	}

	// 对切片进行排序，根据Press方法的返回值 从大到小
	sort.Slice(keys, func(i, j int) bool {
		return c.storge[keys[i]].Press() > c.storge[keys[j]].Press()
	})
	for _, k := range keys {
		v := c.storge[k]
		if err := v.Init(); err != nil {
			return fmt.Errorf("%s init error, %s", k, err)
		}
		fmt.Printf("[%s] %s init success\n", c.name, k)
	}
	return nil
	// for k, v := range c.storge {
	// 	if err := v.Init(); err != nil {
	// 		return fmt.Errorf("%s init error, %s", k, err)
	// 	}
	// 	fmt.Printf("[%s] %s init successs \n", c.name, k)
	// }
	// return nil
}
